home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / autopark.zip / AUTOPARK.ASM next >
Assembly Source File  |  1986-05-03  |  22KB  |  447 lines

  1.               PAGE           66,132
  2. VECTORS       SEGMENT        AT 0H 
  3.               ORG            8H*4
  4. TOD_VECTOR    LABEL          DWORD     ; CLOCK INTERRUPT
  5.               ORG            13H*4
  6. DISK_VECTOR   LABEL          DWORD     ; HARD DISK BIOS CALL
  7. VECTORS       ENDS
  8. ;
  9. ; THIS IS THE START OF THE LOCAL DATA AND EXECUTABLE CODE
  10. ;
  11. CODE_SEG      SEGMENT
  12.               ASSUME         CS:CODE_SEG
  13.               ORG            100H
  14. BEGIN:        CALL           PARK      ; FIND OUT WHERE TO PARK
  15.               JMP            INIT_VECTORS ;INITIALIZE VECTORS & ATTACH TO DOS
  16. ROM_TOD_INT   DD             ?         ; ADDRESSES FOR ROM ROUTINES
  17. ROM_DISK_INT  DD             ?
  18. TIMER_DELAY   DW             546       ; DELAY BEFORE PARKING HEAD
  19. DELAY         DW             ?         ; CLOCK TICKS DURING DELAY
  20. BUSY          DB             0
  21. CYLNUM0       DW             0
  22. CYLNUM1       DW             0
  23. ;
  24. ; PARK THE HARD DISK HEAD AFTER DELAY WITHOUT USE
  25. ;
  26. ;
  27. OUR_TOD_INT   PROC           NEAR
  28.               PUSHF
  29.               CALL           ROM_TOD_INT ; GO TO OTHER CODE FIRST
  30.               PUSH           AX
  31.               PUSH           DS
  32.               MOV            AX,CS     ; SET DATA SEGMENT TO OURSELF
  33.               MOV            DS,AX
  34.               ASSUME         DS:CODE_SEG
  35.               DEC            DELAY     ; HAS DELAY ELAPSED?
  36.               JZ             PARK_IT   ; YUP
  37.               JG             COUNT_DOWN ; NOPE
  38.               MOV            DELAY,0   ; HEAD IS PARKED, RESET COUNTER TO 0
  39. COUNT_DOWN:   POP            DS
  40.               POP            AX
  41.               ASSUME         DS:NOTHING
  42.               IRET
  43. PARK_IT:      ASSUME         DS:CODE_SEG
  44.               PUSH           AX
  45.               PUSH           BX
  46.               PUSH           CX
  47.               PUSH           DX
  48.               TEST           BUSY,80H            ; IS DISK CODE BUSY?
  49.               JNZ            IT_IS_BUSY          ; OOPS, YES
  50.               CMP            CYLNUM0,0           ; IS THERE A DISK 0?
  51.               JE             NODISK0             ; NOPE
  52.               MOV            AH,0CH              ; SEEK
  53.               MOV            AL,1                ; GOTTA HAVE A SECTOR COUNT
  54.               MOV            DL,80H              ; DRIVE 0
  55.               MOV            DH,0                ; GOTTA HAVE A HEAD NUMBER
  56.               MOV            CX,CYLNUM0          ; GET CYL NUMBER
  57.               XCHG           CL,CH               ; PUT LO ORDER IN CH
  58.               SAL            CL,1                ; PUT HI IN TOP OF CL
  59.               SAL            CL,1                ; PUT HI IN TOP OF CL
  60.               SAL            CL,1                ; PUT HI IN TOP OF CL
  61.               SAL            CL,1                ; PUT HI IN TOP OF CL
  62.               SAL            CL,1                ; PUT HI IN TOP OF CL
  63.               SAL            CL,1                ; PUT HI IN TOP OF CL
  64.               INC            CL                  ; NOW SAY SECTOR 1
  65.               PUSHF
  66.               CALL           ROM_DISK_INT        ; MUST USE CALL SINCE INT 13H > HERE
  67. NODISK0:
  68.               CMP            CYLNUM1,0           ; IS THERE A DISK 1?
  69.               JE             NODISK1             ; NO
  70.               MOV            AH,0CH              ; SEEK
  71.               MOV            AL,1                ; GOTTA HAVE A SECTOR COUNT
  72.               MOV            DL,81H              ; DRIVE 1
  73.               MOV            DH,0                ; GOTTA HAVE A HEAD NUMBER
  74.               MOV            CX,CYLNUM1          ; GET CYL NUMBER
  75.               XCHG           CL,CH               ; PUT LO ORDER IN CH
  76.               SAL            CL,1                ; PUT HI IN TOP OF CL
  77.               SAL            CL,1                ; PUT HI IN TOP OF CL
  78.               SAL            CL,1                ; PUT HI IN TOP OF CL
  79.               SAL            CL,1                ; PUT HI IN TOP OF CL
  80.               SAL            CL,1                ; PUT HI IN TOP OF CL
  81.               SAL            CL,1                ; PUT HI IN TOP OF CL
  82.               INC            CL                  ; NOW SAY SECTOR 1
  83.               PUSHF
  84.               CALL           ROM_DISK_INT        ; MUST USE CALL SINCE INT 13H > HERE
  85. NODISK1:
  86.               POP            DX
  87.               POP            CX
  88.               POP            BX
  89.               POP            AX
  90.               JMP            COUNT_DOWN
  91. IT_IS_BUSY:   CALL           RESET               ; DISK IS BUSY, WAIT ANOTHER 5 SEC
  92.               POP            DX
  93.               POP            CX
  94.               POP            BX
  95.               POP            AX
  96.               JMP            COUNT_DOWN
  97. OUR_TOD_INT   ENDP
  98. ;
  99. ; THIS PROCEDURE RESETS THE TIMER COUNT TO ITS INITIAL VALUE
  100. ;
  101. RESET         PROC           NEAR
  102.               PUSH           AX
  103.               PUSH           DS 
  104.               MOV            AX,CS
  105.               MOV            DS,AX
  106.               ASSUME         DS:CODE_SEG
  107.               MOV            AX,TIMER_DELAY
  108.               MOV            DELAY,AX
  109.               POP            DS
  110.               POP            AX
  111.               RET
  112. RESET         ENDP
  113. ;
  114. ;
  115. ; THIS PROCEDURE RESETS THE TIME-OUT COUNTER AND PASSES CONTROL
  116. ; TO THE BIOS DISK ROUTINES
  117. ;
  118. CATCH_DISK    PROC           FAR
  119.               ASSUME         DS:NOTHING
  120.               OR             BUSY,80H  ; MARK DISK BUSY
  121.               TEST           DL,80H    ; IS IT A HARD DISK CALL?
  122.               JZ             NORESET   ; NO
  123.               CALL           RESET     ; RESET THE TIME-OUT COUNTER
  124. NORESET:      PUSHF                    ; SIMULATE INTERRUPT
  125.               CALL           ROM_DISK_INT ; DO BIOS STUFF
  126.               PUSHF                    ; REMEMBER FLAGS FROM DISK ROUTINE
  127.               AND            BUSY,7FH  ; MARK DISK NOT BUSY
  128.               POPF                     ; REMEMBER FLAGS FROM DISK ROUTINE
  129.               RET            2         ; THROW AWAY USER'S SAVED FLAGS
  130. CATCH_DISK    ENDP
  131. ;
  132. ; THIS PROCEDURE INITIALIZES THE INTERRUPT VECTORS
  133. ;
  134. INIT_VECTORS  PROC           NEAR
  135.               ASSUME         DS:VECTORS
  136.               MOV            AX,VECTORS ; SET UP DATA SEGMENT FOR VECTORS
  137.               MOV            DS,AX
  138.               CLI
  139.               MOV            AX,WORD PTR TOD_VECTOR ; SAVE ADDRESSES OF BIOS ROUTINES
  140.               MOV            WORD PTR ROM_TOD_INT,AX
  141.               MOV            AX,WORD PTR TOD_VECTOR[2]
  142.               MOV            WORD PTR ROM_TOD_INT[2],AX
  143.               MOV            WORD PTR TOD_VECTOR,OFFSET OUR_TOD_INT
  144.               MOV            WORD PTR TOD_VECTOR[2],CS
  145.               MOV            AX,WORD PTR DISK_VECTOR
  146.               MOV            WORD PTR ROM_DISK_INT,AX
  147.               MOV            AX,WORD PTR DISK_VECTOR[2]
  148.               MOV            WORD PTR ROM_DISK_INT[2],AX
  149.               MOV            WORD PTR DISK_VECTOR,OFFSET CATCH_DISK
  150.               MOV            WORD PTR DISK_VECTOR[2],CS
  151.               MOV            AX,TIMER_DELAY ; SET DELAY TO STARTING COUNT
  152.               MOV            DELAY,AX
  153.               STI                      ; ALLOW INTERRUPTS AGAIN
  154.               MOV            DX,OFFSET INIT_VECTORS ; END OF RESIDENT PORTION
  155.               INT            27H       ; TERMINATE BUT STAY RESIDENT
  156. INIT_VECTORS  ENDP
  157.               SUBTTL         PARK -- PARK THE HEADS IN ORDER TO FIND OUT WHERE TO PARK
  158.               PAGE
  159. PARK          PROC
  160.               PUSH           AX
  161.               PUSH           CX
  162.               PUSH           DX
  163.               PUSH           ES
  164. ;
  165. ;  MOVE DRIVE 0 AS FAR AS POSSIBLE IN STEPS OF 100 TRACKS
  166. ;
  167. SEEK0100:     MOV            AH,0CH              ; SEEK
  168.               MOV            AL,1                ; GOTTA HAVE A SECTOR COUNT
  169.               MOV            DL,80H              ; DRIVE 0
  170.               MOV            DH,0                ; GOTTA HAVE A HEAD NUMBER
  171.               MOV            CX,CYLNUM0          ; GET CYLINDER NUMBER
  172.               ADD            CX,100              ; INCREMENT BY 100
  173.               MOV            CYLNUM0,CX          ;